1 module unde.games.obj_writer;
2 
3 import unde.games.obj_loader;
4 import std.algorithm;
5 import std.array;
6 import std.conv;
7 import std.path;
8 import std.stdio;
9 
10 import std.string;
11 
12 void save_objfile(ObjFile *obj)
13 {
14     auto file = File(obj.filename, "w");
15 
16     int[3] num;
17 
18     file.writefln("# Dizzy Omega scene splitter");
19     file.writefln("");
20     file.writefln("mtllib %s", obj.mtl.filename.absolutePath().asRelativePath(absolutePath(dirName(obj.filename))));
21     file.writefln("");
22     foreach (object; obj.objects)
23     {
24         file.writefln("o %s", object.name);
25 
26         foreach (vertice; object.vertices)
27             file.writefln("v %.6f %.6f %.6f", vertice[0], vertice[1], vertice[2]);
28 
29         foreach (texcoord; object.texcoords)
30             file.writefln("vt %.6f %.6f", texcoord[0], texcoord[1]);
31 
32         foreach (normal; object.normals)
33             file.writefln("vn %.6f %.6f %.6f", normal[0], normal[1], normal[2]);
34         
35         foreach (mesh; object.meshes)
36         {
37             if (mesh.material !is null)
38                 file.writefln("usemtl %s", mesh.material);
39 
40             file.writefln("s %s", mesh.smooth?"1":"off");
41 
42             foreach (face; mesh.faces)
43             {
44                 if (face[0].normal >= 0)
45                 {
46                     file.writef("f");
47                     foreach (p; face)
48                     {
49                         if (p.tex >= 0)
50                             file.writef(" %s/%s/%s", p.vert+num[0]+1, p.tex+num[1]+1, p.normal+num[2]+1);
51                         else
52                             file.writef(" %s//%s", p.vert+num[0]+1, p.normal+num[2]+1);
53                     }
54                 }
55                 else if (face[0].tex >= 0)
56                 {
57                     file.writef("l");
58                     foreach (p; face)
59                     {
60                         file.writef(" %s/%s", p.vert+num[0]+1, p.tex+num[1]+1);
61                     }
62                 }
63                 else
64                 {
65                     file.writef("p");
66                     foreach (p; face)
67                     {
68                         file.writef(" %s", p.vert+num[0]+1);
69                     }
70                 }
71                 file.writefln("");
72             }
73         }
74 
75         num[0] += object.vertices.length;
76         num[1] += object.texcoords.length;
77         num[2] += object.normals.length;
78     }
79 }